import { customAlphabet } from 'nanoid';

// 生成房间ID - 使用纯数字，长度6位
const generateRoomId = () => {
  // 生成6位数字，确保不以0开头
  const firstDigit = Math.floor(Math.random() * 9) + 1; // 1-9
  let roomId = firstDigit.toString();
  
  for (let i = 1; i < 6; i++) {
    roomId += Math.floor(Math.random() * 10).toString(); // 0-9
  }
  
  return roomId;
};

// 生成玩家ID - 使用小写字母和数字，长度10位
const generatePlayerId = customAlphabet('abcdefghijklmnopqrstuvwxyz0123456789', 10);

// 生成会话ID - 使用混合字符，长度12位
const generateSessionId = customAlphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', 12);

/**
 * 格式化错误响应
 * @param {string} code 错误代码
 * @param {string} message 错误消息
 * @param {any} data 额外数据
 */
export function formatError(code, message, data = null) {
  return {
    success: false,
    error: {
      code,
      message,
      data
    },
    timestamp: new Date().toISOString()
  };
}

/**
 * 格式化成功响应
 * @param {any} data 返回数据
 * @param {string} message 成功消息
 */
export function formatSuccess(data, message = 'Success') {
  return {
    success: true,
    data,
    message,
    timestamp: new Date().toISOString()
  };
}

/**
 * 验证房间名称
 * @param {string} roomName 房间名称
 */
export function validateRoomName(roomName) {
  if (!roomName || typeof roomName !== 'string') {
    return { valid: false, message: '房间名称不能为空' };
  }
  
  if (roomName.length < 2 || roomName.length > 20) {
    return { valid: false, message: '房间名称长度应在2-20个字符之间' };
  }
  
  // 检查特殊字符（允许中文、英文、数字、常见符号）
  const validPattern = /^[a-zA-Z0-9\u4e00-\u9fa5\s\-_]+$/;
  if (!validPattern.test(roomName)) {
    return { valid: false, message: '房间名称包含不支持的字符' };
  }
  
  return { valid: true };
}

/**
 * 验证玩家名称
 * @param {string} playerName 玩家名称
 */
export function validatePlayerName(playerName) {
  if (!playerName || typeof playerName !== 'string') {
    return { valid: false, message: '玩家名称不能为空' };
  }
  
  if (playerName.length < 1 || playerName.length > 12) {
    return { valid: false, message: '玩家名称长度应在1-12个字符之间' };
  }
  
  // 检查特殊字符（允许中文、英文、数字、常见符号）
  const validPattern = /^[a-zA-Z0-9\u4e00-\u9fa5\s\-_]+$/;
  if (!validPattern.test(playerName)) {
    return { valid: false, message: '玩家名称包含不支持的字符' };
  }
  
  return { valid: true };
}

/**
 * 获取安全的玩家数据（不包含敏感信息）
 * @param {Object} player 玩家对象
 */
export function getSafePlayerData(player) {
  if (!player) return null;
  
  return {
    id: player.id,
    name: player.name,
    seatIndex: player.seatIndex,
    isReady: player.isReady,
    isAI: player.isAI || player.is_ai || false, // 支持两种字段名
    status: player.status,
    cardCount: player.cards ? player.cards.length : 0,
    joinedAt: player.joinedAt
  };
}

/**
 * 获取安全的房间数据（不包含敏感信息）
 * @param {Object} room 房间对象
 */
export function getSafeRoomData(room) {
  if (!room) return null;
  
  return {
    id: room.id,
    name: room.name,
    hostId: room.hostId, // 确保包含房主ID
    status: room.status,
    playerCount: room.playerCount || (room.players ? room.players.length : 0),
    maxPlayers: room.maxPlayers || 3,
    players: room.players ? room.players.map(getSafePlayerData) : [],
    gameConfig: room.gameConfig || {},
    createdAt: room.createdAt
  };
}

/**
 * 延迟执行
 * @param {number} ms 毫秒数
 */
export function delay(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

/**
 * 深度克隆对象
 * @param {any} obj 要克隆的对象
 */
export function deepClone(obj) {
  if (obj === null || typeof obj !== 'object') return obj;
  if (obj instanceof Date) return new Date(obj);
  if (obj instanceof Array) return obj.map(deepClone);
  if (typeof obj === 'object') {
    const clonedObj = {};
    for (const key in obj) {
      if (obj.hasOwnProperty(key)) {
        clonedObj[key] = deepClone(obj[key]);
      }
    }
    return clonedObj;
  }
}

export { generateRoomId, generatePlayerId, generateSessionId };